package paidaxing.blog.file.controller;

import cn.dev33.satoken.stp.StpUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import paidaxing.blog.common.result.Result;
import paidaxing.blog.file.dto.FileDTO;
import paidaxing.blog.file.dto.response.FileResponseDTO;
import paidaxing.blog.file.service.FileService;

import java.util.List;

@Slf4j
@RestController
@RequestMapping
public class FileController {

    @Resource
    private FileService fileService;

    /**
     * 文件上传
     *
     * @param file 文件
     * @return 上传结果
     */
    @PostMapping("/upload")
    public Result<FileDTO> uploadFile(@RequestParam("file") MultipartFile file,
                                      @RequestParam(required = false) String description) {
        if (log.isInfoEnabled()) {
            log.info("文件上传: {}, 描述: {}", file.getOriginalFilename(), description);
        }
        
        // 检查用户是否登录
        StpUtil.checkLogin();
        
        FileDTO fileDTO = fileService.uploadFile(file, description);
        if (fileDTO == null) {
            return Result.failed("文件上传失败");
        }
        return Result.success("文件上传成功!", fileDTO);
    }

    /**
     * 图片上传
     *
     * @param image 图片文件
     * @return 上传结果
     */
    @PostMapping("/upload/image")
    public Result<FileDTO> uploadImage(@RequestParam("image") MultipartFile image,
                                       @RequestParam(required = false) String description) {
        if (log.isInfoEnabled()) {
            log.info("图片上传: {}, 描述: {}", image.getOriginalFilename(), description);
        }
        
        // 检查用户是否登录
        StpUtil.checkLogin();
        
        FileDTO fileDTO = fileService.uploadImage(image, description);
        if (fileDTO == null) {
            return Result.failed("图片上传失败");
        }
        return Result.success("图片上传成功!", fileDTO);
    }

    /**
     * 获取文件信息
     *
     * @param fileId 文件ID
     * @return 文件信息
     */
    @GetMapping("/files/{fileId}")
    public Result<FileResponseDTO> getFileById(@PathVariable Long fileId) {
        if (log.isInfoEnabled()) {
            log.info("获取文件信息，ID: {}", fileId);
        }
        
        FileResponseDTO fileResponseDTO = fileService.getFileById(fileId);
        if (fileResponseDTO == null) {
            return Result.failed("文件不存在");
        }
        return Result.success("获取文件信息成功!", fileResponseDTO);
    }

    /**
     * 删除文件
     *
     * @param fileId 文件ID
     * @return 删除结果
     */
    @DeleteMapping("/files/{fileId}")
    public Result<String> deleteFile(@PathVariable Long fileId) {
        if (log.isInfoEnabled()) {
            log.info("删除文件，ID: {}", fileId);
        }
        
        // 检查用户是否登录
        StpUtil.checkLogin();
        
        try {
            boolean result = fileService.deleteFile(fileId);
            if (!result) {
                return Result.failed("文件删除失败");
            }
            return Result.success("文件删除成功!");
        } catch (Exception e) {
            return Result.failed(e.getMessage());
        }
    }

    /**
     * 获取文件列表
     *
     * @param page 页码，默认为1
     * @param size 每页大小，默认为10
     * @return 文件列表
     */
    @GetMapping("/files")
    public Result<List<FileResponseDTO>> getFileList(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        if (log.isInfoEnabled()) {
            log.info("获取文件列表，页码: {}, 每页大小: {}", page, size);
        }
        
        List<FileResponseDTO> fileList = fileService.getFileList(page, size);
        return Result.success("获取文件列表成功!", fileList);
    }

    /**
     * 文件下载
     *
     * @param fileId 文件ID
     * @return 文件内容
     */
    @GetMapping("/download/{fileId}")
    public Result<byte[]> downloadFile(@PathVariable Long fileId) {
        if (log.isInfoEnabled()) {
            log.info("下载文件，ID: {}", fileId);
        }
        
        try {
            byte[] fileBytes = fileService.downloadFile(fileId);
            return Result.success("文件下载成功!", fileBytes);
        } catch (Exception e) {
            return Result.failed(e.getMessage());
        }
    }
}